XSS ๊ณต๊ฒฉ ๋ฐ ๊ธฐํ ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก๋ถํฐ ์น์ฌ์ดํธ๋ฅผ ๋ณดํธํ๋ ๊ฐ๋ ฅํ ๋ธ๋ผ์ฐ์ ๋ณด์ ๋ฉ์ปค๋์ฆ์ธ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ์ดํด๋ณด์ธ์. ๊ฐํ๋ ๋ณด์์ ์ํด CSP๋ฅผ ๊ตฌํํ๊ณ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
๋ธ๋ผ์ฐ์ ๋ณด์: ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP) ์ฌ์ธต ๋ถ์
์ค๋๋ ์ ์น ํ๊ฒฝ์์๋ ๋ณด์์ด ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ์น์ฌ์ดํธ๋ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS), ๋ฐ์ดํฐ ์ฃผ์ , ํด๋ฆญ์ฌํน ๋ฑ ์ ์ฌ์ ์ธ ๊ณต๊ฒฉ์ ๋์์๋ ๊ณต์ธ์ ์ง๋ฉดํด ์์ต๋๋ค. ์ด๋ฌํ ์ํ์ ๋ํ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ์ด์ฑ ์ค ํ๋๊ฐ ๋ฐ๋ก ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ๋๋ค. ์ด ๊ธ์์๋ CSP์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์ ์ํ CSP์ ์ด์ , ๊ตฌํ ๋ฐฉ๋ฒ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ด๋ ๋ฌด์์ธ๊ฐ?
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ๋ฐ ๋ฐ์ดํฐ ์ฃผ์ ๊ณต๊ฒฉ๊ณผ ๊ฐ์ ํน์ ์ ํ์ ๊ณต๊ฒฉ์ ํ์งํ๊ณ ์ํํ๋ ๋ฐ ๋์์ด ๋๋ ์ถ๊ฐ์ ์ธ ๋ณด์ ๊ณ์ธต์ ๋๋ค. ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ฐ์ดํฐ ํ์ทจ๋ถํฐ ์ฌ์ดํธ ๋ณ์กฐ, ๋ฉ์จ์ด ๋ฐฐํฌ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ์ฌ์ฉ๋ฉ๋๋ค.
CSP๋ ๋ณธ์ง์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ด๋ค ์ฝํ ์ธ ์์ค๋ฅผ ์์ ํ๊ฒ ๋ก๋ํ ์ ์๋์ง ์๋ ค์ฃผ๋ ํ์ฉ ๋ชฉ๋ก(whitelist)์ ๋๋ค. ์๊ฒฉํ ์ ์ฑ ์ ์ ์ํจ์ผ๋ก์จ, ๋ช ์์ ์ผ๋ก ์น์ธ๋์ง ์์ ์์ค์ ์ฝํ ์ธ ๋ฅผ ๋ฌด์ํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์ง์ํ์ฌ ๋ง์ XSS ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ผ๋ก ๋ฌด๋ ฅํํฉ๋๋ค.
CSP๋ ์ ์ค์ํ๊ฐ?
CSP๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- XSS ๊ณต๊ฒฉ ์ํ: ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝํ ์ธ ๋ฅผ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ ์ดํจ์ผ๋ก์จ CSP๋ XSS ๊ณต๊ฒฉ์ ์ํ์ ๊ทน์ ์ผ๋ก ์ค์ ๋๋ค.
- ํด๋ฆญ์ฌํน ์ทจ์ฝ์ ๊ฐ์: CSP๋ ์น์ฌ์ดํธ๊ฐ ํ๋ ์์ผ๋ก ํ์๋ ์ ์๋ ๋ฐฉ์์ ์ ์ดํ์ฌ ํด๋ฆญ์ฌํน ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- HTTPS ๊ฐ์ : CSP๋ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ HTTPS๋ฅผ ํตํด ๋ก๋๋๋๋ก ๋ณด์ฅํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ(man-in-the-middle attacks)์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ์ ๋ขฐํ ์ ์๋ ์ฝํ ์ธ ์ ์ํฅ ๊ฐ์: ์ ๋ขฐํ ์ ์๋ ์ฝํ ์ธ ๊ฐ ํ์ด์ง์ ์ด๋ป๊ฒ๋ ์ฃผ์ ๋๋๋ผ๋ CSP๋ ์ ํดํ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค.
- ๋ณด๊ณ ๊ธฐ๋ฅ ์ ๊ณต: CSP๋ ์๋ฐ ์ฌํญ์ ๋ณด๊ณ ํ๋๋ก ๊ตฌ์ฑํ ์ ์์ด ๋ณด์ ์ ์ฑ ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
CSP ์๋ ๋ฐฉ์
CSP๋ ์น ํ์ด์ง์ HTTP ์๋ต ํค๋๋ <meta> ํ๊ทธ๋ฅผ ์ถ๊ฐํ์ฌ ์๋ํฉ๋๋ค. ์ด ํค๋/ํ๊ทธ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ ๋ ๋ฐ๋์ ์ํํด์ผ ํ๋ ์ ์ฑ ์ ์ ์ํฉ๋๋ค. ์ด ์ ์ฑ ์ ์ผ๋ จ์ ์ง์์ด(directives)๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ ์ง์์ด๋ ํน์ ์ ํ์ ๋ฆฌ์์ค(์: ์คํฌ๋ฆฝํธ, ์คํ์ผ์ํธ, ์ด๋ฏธ์ง, ๊ธ๊ผด)์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํ์ฉ๋ ์์ค์ ์ผ์นํ์ง ์๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํ์ฌ ์ด ์ ์ฑ ์ ์ํํฉ๋๋ค. ์๋ฐ์ด ๋ฐ์ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ ํ์ ์ผ๋ก ์ง์ ๋ URL์ ์ด๋ฅผ ๋ณด๊ณ ํ ์ ์์ต๋๋ค.
CSP ์ง์์ด: ์ข ํฉ์ ์ธ ๊ฐ์
CSP ์ง์์ด๋ ์ ์ฑ ์ ํต์ฌ์ผ๋ก, ๋ค์ํ ์ ํ์ ๋ฆฌ์์ค์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ํ์์ ์ธ ์ง์์ด์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
default-src: ์ด ์ง์์ด๋ ๋ค๋ฅธ ์ง์์ด์ ์ํด ๋ช ์์ ์ผ๋ก ์ง์ ๋์ง ์์ ๋ชจ๋ ๋ฆฌ์์ค ์ ํ์ ๊ธฐ๋ณธ ์์ค๋ฅผ ์ ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ CSP ์ ์ฑ ์ ์ข์ ์ถ๋ฐ์ ์ ๋๋ค. `script-src`์ ๊ฐ์ ๋ ๊ตฌ์ฒด์ ์ธ ์ง์์ด๊ฐ ์ ์๋๋ฉด ์คํฌ๋ฆฝํธ์ ๋ํ `default-src` ์ง์์ด๋ฅผ ์ฌ์ ์ํฉ๋๋ค.script-src: ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค. XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๊ฐ์ฅ ์ค์ํ ์ง์์ด ์ค ํ๋์ ๋๋ค.style-src: CSS ์คํ์ผ์ํธ์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.img-src: ์ด๋ฏธ์ง์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.font-src: ๊ธ๊ผด์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.media-src: <audio>, <video>, <track> ์์์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.object-src: <object>, <embed>, <applet> ์์์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค. ์ฐธ๊ณ : ์ด๋ฌํ ์์๋ ์ข ์ข ๋ณด์ ์ทจ์ฝ์ ์ ์์ธ์ด ๋๋ฏ๋ก ๊ฐ๋ฅํ๋ฉด ์ด ๊ฐ์ 'none'์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.frame-src: <iframe> ์์์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.connect-src: XMLHttpRequest, WebSocket, EventSource ์ฐ๊ฒฐ์ ๋ํด ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ ์น์ฌ์ดํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ ์์น๋ฅผ ์ ์ดํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.base-uri: ๋ฌธ์์ ํ์ฉ๋ ๊ธฐ๋ณธ URL์ ์ง์ ํฉ๋๋ค.form-action: ํผ์ด ์ ์ถ๋ ์ ์๋ ํ์ฉ๋ URL์ ์ง์ ํฉ๋๋ค.frame-ancestors: <frame>, <iframe>, <object> ๋๋ <applet>์์ ํ์ฌ ํ์ด์ง๋ฅผ ํฌํจํ ์ ์๋ ํ์ฉ๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ ํด๋ฆญ์ฌํน ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.upgrade-insecure-requests: ๋ชจ๋ ๋น๋ณด์(HTTP) ์์ฒญ์ ๋ณด์(HTTPS) ์์ฒญ์ผ๋ก ์๋ ์ ๊ทธ๋ ์ด๋ํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์ง์ํฉ๋๋ค. ์ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ ํ๊ฒ ์ ์ก๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค.block-all-mixed-content: ํ์ด์ง๊ฐ HTTPS๋ฅผ ํตํด ๋ก๋๋ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ HTTP๋ฅผ ํตํด ์ด๋ค ๋ฆฌ์์ค๋ ๋ก๋ํ์ง ๋ชปํ๊ฒ ํฉ๋๋ค. ์ด๋upgrade-insecure-requests์ ๋ ๊ณต๊ฒฉ์ ์ธ ๋ฒ์ ์ ๋๋ค.report-uri: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด์ผ ํ๋ URL์ ์ง์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด CSP ์ ์ฑ ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. *๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ, `report-to`๋ก ๋์ฒด๋จ*report-to: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด์ผ ํ๋ `Report-To` HTTP ํค๋์ ์ ์๋ ๊ทธ๋ฃน ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์ด ์ง์์ด๋ `Report-To` ํค๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค.require-trusted-types-for: DOM ๊ธฐ๋ฐ XSS ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋๋ DOM API์ธ Trusted Types๋ฅผ ํ์ฑํํฉ๋๋ค. ํน์ Trusted Types ๊ตฌํ ๋ฐ ๊ตฌ์ฑ์ด ํ์ํฉ๋๋ค.trusted-types: ์ฑํฌ(sinks)๋ฅผ ์์ฑํ ์ ์๋๋ก ํ์ฉ๋ Trusted Types ์ ์ฑ ๋ชฉ๋ก์ ์ ์ํฉ๋๋ค.
์์ค ๋ชฉ๋ก ํค์๋
URL ์ธ์๋ CSP ์ง์์ด๋ ํ์ฉ๋ ์์ค๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ๋ฌ ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
'self': ๋ณดํธ๋ ๋ฌธ์์ ๋์ผํ ์ถ์ฒ(์คํค๋ง ๋ฐ ๋๋ฉ์ธ)์ ์ฝํ ์ธ ๋ฅผ ํ์ฉํฉ๋๋ค.'unsafe-inline': ์ธ๋ผ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ CSS ์ฌ์ฉ์ ํ์ฉํฉ๋๋ค. CSP๋ฅผ ์๋นํ ์ฝํ์ํค๊ณ XSS ์ทจ์ฝ์ ์ ๋ค์ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก ๊ทน๋์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ฐ๋ฅํ๋ฉด ํผํ์ธ์.'unsafe-eval':eval()๋ฐFunction()๊ณผ ๊ฐ์ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฐ ํจ์ ์ฌ์ฉ์ ํ์ฉํฉ๋๋ค. ์ด ๋ํ CSP๋ฅผ ์ฝํ์ํค๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํ์ธ์. ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด๊ณผ ๊ฐ์ ๋์์ ๊ณ ๋ คํ์ธ์.'unsafe-hashes': ํน์ ์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ SHA256, SHA384 ๋๋ SHA512 ํด์๋ฅผ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ์ฌ ํ์ฉํฉ๋๋ค. ๋ชจ๋ ์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฆ์ ๋ค์ ์์ฑํ์ง ์๊ณ CSP๋ก ์ ํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.'none': ์ด๋ค ์์ค์ ์ฝํ ์ธ ๋ ํ์ฉํ์ง ์์ต๋๋ค.'strict-dynamic': ์ ๋ขฐํ ์ ์๋ ์คํฌ๋ฆฝํธ์ ์ํด ๋ก๋๋ ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฑ ์ ๋ฐ๋ผ ์ผ๋ฐ์ ์ผ๋ก ํ์ฉ๋์ง ์๋๋ผ๋ ์ถ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ์ ์ ์ฉํฉ๋๋ค.'report-sample': ์๋ฐ ๋ณด๊ณ ์์ ์๋ฐ ์ฝ๋์ ์ํ์ ํฌํจํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์ง์ํฉ๋๋ค. CSP ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.data:: data: URL(์: ๋ด์ฅ ์ด๋ฏธ์ง)์์ ๋ฆฌ์์ค ๋ก๋๋ฅผ ํ์ฉํฉ๋๋ค. ์ฃผ์ํด์ ์ฌ์ฉํ์ธ์.mediastream:: mediastream: URL(์: ์น์บ ๋๋ ๋ง์ดํฌ)์์ ๋ฆฌ์์ค ๋ก๋๋ฅผ ํ์ฉํฉ๋๋ค.blob:: blob: URL(์: ๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด)์์ ๋ฆฌ์์ค ๋ก๋๋ฅผ ํ์ฉํฉ๋๋ค.filesystem:: filesystem: URL(์: ๋ก์ปฌ ํ์ผ ์์คํ ์ ๊ทผ)์์ ๋ฆฌ์์ค ๋ก๋๋ฅผ ํ์ฉํฉ๋๋ค.
CSP ๊ตฌํ: ์ค์ ์์
CSP๋ฅผ ๊ตฌํํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค:
- HTTP ์๋ต ํค๋: ๋ ํฐ ์ ์ฐ์ฑ๊ณผ ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
- <meta> ํ๊ทธ: ๋ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง, ์ ํ ์ฌํญ์ด ์์ต๋๋ค(์:
frame-ancestors์ ํจ๊ป ์ฌ์ฉํ ์ ์์).
์์ 1: HTTP ์๋ต ํค๋
CSP ํค๋๋ฅผ ์ค์ ํ๋ ค๋ฉด ์น ์๋ฒ(์: Apache, Nginx, IIS)๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ํน์ ๊ตฌ์ฑ์ ์๋ฒ ์ํํธ์จ์ด์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๋ค์์ CSP ํค๋์ ์์ ๋๋ค:
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report
์ค๋ช :
default-src 'self': ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ํ์ฉํฉ๋๋ค.script-src 'self' https://example.com: ๋์ผํ ์ถ์ฒ์https://example.com์์ ์ค๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํฉ๋๋ค.style-src 'self' 'unsafe-inline': ๋์ผํ ์ถ์ฒ์ CSS์ ์ธ๋ผ์ธ ์คํ์ผ์ ํ์ฉํฉ๋๋ค(์ฃผ์ํด์ ์ฌ์ฉ).img-src 'self' data:: ๋์ผํ ์ถ์ฒ์ ์ด๋ฏธ์ง์ ๋ฐ์ดํฐ URL์ ํ์ฉํฉ๋๋ค.report-uri /csp-report: ์๋ฒ์/csp-report์๋ํฌ์ธํธ๋ก ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ ๋๋ค.
์์ 2: <meta> ํ๊ทธ
<meta> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ CSP ์ ์ฑ ์ ์ ์ํ ์๋ ์์ต๋๋ค:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:">
์ฐธ๊ณ : <meta> ํ๊ทธ ์ ๊ทผ ๋ฐฉ์์๋ ์ ํ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํด๋ฆญ์ฌํน ๊ณต๊ฒฉ ๋ฐฉ์ง์ ์ค์ํ frame-ancestors ์ง์์ด๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์ CSP
CSP ์ ์ฑ ์ ์ํํ๊ธฐ ์ ์ ๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์์ ํ ์คํธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์๋ฐ ์ฌํญ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋๋ฅผ ํ์ฑํํ๋ ค๋ฉด Content-Security-Policy ๋์ Content-Security-Policy-Report-Only ํค๋๋ฅผ ์ฌ์ฉํ์ธ์:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://example.com; report-uri /csp-report
๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์์ ๋ธ๋ผ์ฐ์ ๋ ์ง์ ๋ URL๋ก ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด์ง๋ง ์ด๋ค ๋ฆฌ์์ค๋ ์ฐจ๋จํ์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฑ ์ ์ํํ๊ธฐ ์ ์ ์ ์ฑ ์ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
๋ณด๊ณ URI ์๋ํฌ์ธํธ ์ค์ ํ๊ธฐ
report-uri (๋ ์ด์ ์ฌ์ฉ๋์ง ์์, `report-to` ์ฌ์ฉ) ์ง์์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด์ผ ํ๋ URL์ ์ง์ ํฉ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฒ์ ์๋ํฌ์ธํธ๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด ๋ณด๊ณ ์๋ค์ POST ์์ฒญ์ ๋ณธ๋ฌธ์ JSON ๋ฐ์ดํฐ๋ก ์ ์ก๋ฉ๋๋ค.
๋ค์์ Node.js์์ CSP ๋ณด๊ณ ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ์์ ๋๋ค:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
app.use(bodyParser.json({ type: 'application/csp-report' }));
app.post('/csp-report', (req, res) => {
console.log('CSP ์๋ฐ ๋ณด๊ณ ์:', JSON.stringify(req.body, null, 2));
res.status(204).end(); // 204 No Content๋ก ์๋ต
});
app.listen(port, () => {
console.log(`CSP ๋ณด๊ณ ์ ์๋ฒ๊ฐ http://localhost:${port}์์ ์์ ๋๊ธฐ ์ค์
๋๋ค`);
});
์ด ์ฝ๋๋ /csp-report ์๋ํฌ์ธํธ์ ๋ํ POST ์์ฒญ์ ์์ ํ๋ ๊ฐ๋จํ ์๋ฒ๋ฅผ ์ค์ ํฉ๋๋ค. ๋ณด๊ณ ์๊ฐ ์์ ๋๋ฉด ์ฝ์์ ๋ณด๊ณ ์๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ๋ถ์์ ์ํด ์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
`report-to`๋ฅผ ์ฌ์ฉํ ๋๋ `Report-To` HTTP ํค๋๋ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ด ํค๋๋ ๋ณด๊ณ ์๋ํฌ์ธํธ์ ๊ทธ ์์ฑ์ ์ ์ํฉ๋๋ค.
Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"https://example.com/csp-report"}],"include_subdomains":true}
๊ทธ๋ฐ ๋ค์ CSP ํค๋์์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค:
Content-Security-Policy: default-src 'self'; report-to csp-endpoint;
CSP ๋ชจ๋ฒ ์ฌ๋ก
CSP๋ฅผ ๊ตฌํํ ๋ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๊ฒฉํ ์ ์ฑ ์ผ๋ก ์์ํ๊ธฐ: ์ ํ์ ์ธ ์ ์ฑ ์ผ๋ก ์์ํ์ฌ ํ์์ ๋ฐ๋ผ ์ ์ฐจ ์ํํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ์กฐ๊ธฐ์ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ฐ ์คํ์ผ์ Nonce ๋๋ ํด์ ์ฌ์ฉ: ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์คํ์ผ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, nonce(์ํธํ์ ์ผ๋ก ๋ฌด์์ ๊ฐ)๋ ํด์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ฝ๋ ๋ธ๋ก์ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ์ญ์์ค. ์ด๋
'unsafe-inline'์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ์์ ํฉ๋๋ค. 'unsafe-eval'ํผํ๊ธฐ:'unsafe-eval'์ง์์ด๋ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฐ ํจ์์ ์ฌ์ฉ์ ํ์ฉํ๋ฉฐ, ์ด๋ ์ฃผ์ ๋ณด์ ์ํ์ด ๋ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ์ด ์ง์์ด ์ฌ์ฉ์ ํผํ์ญ์์ค. ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ด๋ ๋ค๋ฅธ ๋์์ ๊ณ ๋ คํ์ญ์์ค.- ๋ชจ๋ ๋ฆฌ์์ค์ HTTPS ์ฌ์ฉ: ์ค๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ ๋ฆฌ์์ค๊ฐ HTTPS๋ฅผ ํตํด ๋ก๋๋๋๋ก ํ์ญ์์ค.
upgrade-insecure-requests์ง์์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ณด์ ์์ฒญ์ ์๋์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ์ญ์์ค. - ์ ์ฑ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ฐ์ : ์ ๊ธฐ์ ์ผ๋ก CSP ์๋ฐ ๋ณด๊ณ ์๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์ ์ฑ ์ ๊ฐ์ ํ์ญ์์ค. ์ด๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ฉฐ ์ ์ฑ ์ด ํจ๊ณผ์ ์ผ๋ก ์ ์ง๋๋๋ก ํ ์ ์์ต๋๋ค.
- CSP ์์ฑ๊ธฐ ์ฌ์ฉ ๊ณ ๋ ค: ์น์ฌ์ดํธ์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ CSP ์ ์ฑ ์ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ ์ฌ๋ฌ ์จ๋ผ์ธ ๋๊ตฌ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๊ฐ๋ ฅํ๊ณ ํจ๊ณผ์ ์ธ ์ ์ฑ ์ ๋ง๋๋ ๊ณผ์ ์ ๋จ์ํํ ์ ์์ต๋๋ค.
- ์ฒ ์ ํ ํ ์คํธ: CSP ์ ์ฑ ์ ์ํํ๊ธฐ ์ ์ ๋ณด๊ณ ์ ์ ์ฉ ๋ชจ๋์์ ์ฒ ์ ํ ํ ์คํธํ์ฌ ์น์ฌ์ดํธ์ ๊ธฐ๋ฅ์ด ์์๋์ง ์๋์ง ํ์ธํ์ญ์์ค.
- ํ๋ ์์ํฌ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ: ์ผ๋ถ ์น ๊ฐ๋ฐ ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ CSP์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด CSP ์ ์ฑ ์ ๊ตฌํํ๊ณ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ๋จ์ํํ ์ ์์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ ์ธ์ง: CSP๋ ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋์ง๋ง ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ์ผ๋ถ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ์ ์ฑ ์ ํ ์คํธํ์ฌ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ญ์์ค.
- ํ ๊ต์ก: ๊ฐ๋ฐํ์ด CSP์ ์ค์์ฑ๊ณผ ์ฌ๋ฐ๋ฅธ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ดํดํ๋๋ก ํ์ญ์์ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ ์ ๋ฐ์ ๊ฑธ์ณ CSP๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋๊ณ ์ ์ง๋๋๋ก ํ ์ ์์ต๋๋ค.
CSP์ ์ 3์ ์คํฌ๋ฆฝํธ
CSP๋ฅผ ๊ตฌํํ๋ ๋ฐ ์์ด ๊ฐ์ฅ ํฐ ๊ณผ์ ์ค ํ๋๋ ์ 3์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ๋๋ค. ๋ง์ ์น์ฌ์ดํธ๊ฐ ๋ถ์, ๊ด๊ณ ๋ฐ ๊ธฐํ ๊ธฐ๋ฅ์ ์ํด ์ 3์ ์๋น์ค์ ์์กดํฉ๋๋ค. ์ด๋ฌํ ์คํฌ๋ฆฝํธ๋ ์ ๋๋ก ๊ด๋ฆฌ๋์ง ์์ผ๋ฉด ๋ณด์ ์ทจ์ฝ์ ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
CSP๋ก ์ 3์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ธ๋ฆฌ์์ค ๋ฌด๊ฒฐ์ฑ(SRI) ์ฌ์ฉ: SRI๋ฅผ ์ฌ์ฉํ๋ฉด ์ 3์ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ์กฐ๋์ง ์์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ 3์ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ๋ ์คํฌ๋ฆฝํธ์ ํด์์ ํจ๊ป
integrity์์ฑ์ ํฌํจํ์ญ์์ค. ๊ทธ๋ฌ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ํด์์ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค. - ์ 3์ ์คํฌ๋ฆฝํธ ๋ก์ปฌ ํธ์คํ : ๊ฐ๋ฅํ๋ค๋ฉด ์ 3์ ์ค๋ฆฝํธ๋ฅผ ์์ฒด ์๋ฒ์ ๋ก์ปฌ๋ก ํธ์คํ ํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํฌ๋ฆฝํธ์ ๋ํ ๋ ๋ง์ ์ ์ด๊ถ์ ๊ฐ๊ณ ์์๋ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค.
- CSP๋ฅผ ์ง์ํ๋ ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN) ์ฌ์ฉ: ์ผ๋ถ CDN์ CSP์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ 3์ ์คํฌ๋ฆฝํธ์ ๋ํ CSP ๊ตฌํ ๋ฐ ๊ด๋ฆฌ ๊ณผ์ ์ ๋จ์ํํ ์ ์์ต๋๋ค.
- ์ 3์ ์คํฌ๋ฆฝํธ์ ๊ถํ ์ ํ: CSP๋ฅผ ์ฌ์ฉํ์ฌ ์ 3์ ์คํฌ๋ฆฝํธ์ ๊ถํ์ ์ ํํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ฑฐ๋ ์น์ธ๋์ง ์์ ๋๋ฉ์ธ์ ์์ฒญํ๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค.
- ์ 3์ ์คํฌ๋ฆฝํธ ์ ๊ธฐ์ ๊ฒํ : ์น์ฌ์ดํธ์์ ์ฌ์ฉํ๋ ์ 3์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํ์ฌ ์ฌ์ ํ ์์ ํ๊ณ ์ ๋ขฐํ ์ ์๋์ง ํ์ธํ์ญ์์ค.
๊ณ ๊ธ CSP ๊ธฐ๋ฒ
๊ธฐ๋ณธ์ ์ธ CSP ์ ์ฑ ์ ๋ง๋ จํ ํ์๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ธฐ๋ฒ์ ํ์ํ์ฌ ์น์ฌ์ดํธ์ ๋ณด์์ ๋์ฑ ๊ฐํํ ์ ์์ต๋๋ค:
- ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ฐ ์คํ์ผ์ Nonce ์ฌ์ฉ: ์์ ์ธ๊ธํ๋ฏ์ด, nonce๋ ํน์ ์ธ๋ผ์ธ ์ฝ๋ ๋ธ๋ก์ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ํธํ์ ์ผ๋ก ๋ฌด์์ ๊ฐ์ ๋๋ค. nonce๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ ์์ฒญ์ ๋ํด ๊ณ ์ ํ nonce๋ฅผ ์์ฑํ๊ณ CSP ํค๋์ ์ธ๋ผ์ธ ์ฝ๋ ๋ชจ๋์ ํฌํจํด์ผ ํฉ๋๋ค.
- ์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ํด์ ์ฌ์ฉ:
'unsafe-hashes'์ง์์ด๋ ํน์ ์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ SHA256, SHA384 ๋๋ SHA512 ํด์๋ก ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ์ธ๋ผ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฆ์ ๋ค์ ์์ฑํ์ง ์๊ณ CSP๋ก ์ ํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. - Trusted Types ์ฌ์ฉ: Trusted Types๋ DOM ๊ธฐ๋ฐ XSS ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋๋ DOM API์ ๋๋ค. ํน์ ์ปจํ ์คํธ์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์์ด ๋ณด์ฅ๋ ํน์ ์ ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค.
- Feature Policy ์ฌ์ฉ: Feature Policy(ํ์ฌ๋ Permissions Policy)๋ฅผ ์ฌ์ฉํ๋ฉด ์น์ฌ์ดํธ์์ ์ฌ์ฉํ ์ ์๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ ์ ์ดํ ์ ์์ต๋๋ค. ์ด๋ ํน์ ์ ํ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ณ ์น์ฌ์ดํธ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํด๋ฐฑ(Fallback)๊ณผ ํจ๊ป ์๋ธ๋ฆฌ์์ค ๋ฌด๊ฒฐ์ฑ(SRI) ์ฌ์ฉ: SRI๋ฅผ ํด๋ฐฑ ๋ฉ์ปค๋์ฆ๊ณผ ๊ฒฐํฉํ์ญ์์ค. SRI ๊ฒ์ฌ๊ฐ ์คํจํ๋ฉด(์: CDN ๋ค์ด), ์์ฒด ์๋ฒ์ ํธ์คํ ๋ ๋ฆฌ์์ค์ ๋ฐฑ์ ๋ณต์ฌ๋ณธ์ ์ค๋นํด ๋ก๋๋ค.
- ๋์ CSP ์์ฑ: ์ฌ์ฉ์ ์ธ์ , ์ญํ ๋๋ ๊ธฐํ ๋ฌธ๋งฅ ์ ๋ณด์ ๋ฐ๋ผ ์๋ฒ ์ธก์์ ๋์ ์ผ๋ก CSP๋ฅผ ์์ฑํฉ๋๋ค.
- CSP์ ์น์์ผ: ์น์์ผ์ ์ฌ์ฉํ ๋๋ ์ ๋ขฐํ ์ ์๋ ์น์์ผ ์๋ํฌ์ธํธ์๋ง ์ฐ๊ฒฐ์ ํ์ฉํ๋๋ก `connect-src` ์ง์์ด๋ฅผ ์ ์คํ๊ฒ ๊ตฌ์ฑํ์ญ์์ค.
CSP ๊ตฌํ์ ๋ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก CSP๋ฅผ ๊ตฌํํ ๋๋ ๋ค์์ ๊ณ ๋ คํ์ญ์์ค:
- CDN ์์น: ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)๊ฐ ์ฌ๋ฌ ์ง๋ฆฌ์ ์์น์ ์๋ฒ๋ฅผ ๋ณด์ ํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ณ ์์ ์ ์ธ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋์ง ํ์ธํ์ญ์์ค. CDN์ด CSP๋ฅผ ์ง์ํ๊ณ ํ์ํ ํค๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ธํ์ญ์์ค.
- ๊ธ๋ก๋ฒ ๊ท์ : GDPR(์ ๋ฝ), CCPA(์บ๋ฆฌํฌ๋์) ๋ฐ ๊ธฐํ ์ง์ญ ๋ฒ๋ฅ ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ผ์ด๋ฒ์ ๊ท์ ์ ์ธ์งํ์ญ์์ค. ํนํ ์๋ฐ ๋ณด๊ณ ์๋ฅผ ์ฒ๋ฆฌํ ๋ CSP ๊ตฌํ์ด ์ด๋ฌํ ๊ท์ ์ ์ค์ํ๋์ง ํ์ธํ์ญ์์ค.
- ํ์งํ: CSP๊ฐ ํ์งํ๋ ์ฝํ ์ธ ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ๊ณ ๋ คํ์ญ์์ค. ๋ค๋ฅธ ์ธ์ด ๋๋ ์ง์ญ์ ๋ํด ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ ์คํ์ผ์ด ์๋ ๊ฒฝ์ฐ, CSP ์ ์ฑ ์ด ์ด๋ฌํ ๋ณํ์ ์์ฉํ๋์ง ํ์ธํ์ญ์์ค.
- ๋ค๊ตญ์ด ๋๋ฉ์ธ ์ด๋ฆ(IDN): ์น์ฌ์ดํธ๊ฐ IDN์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, CSP ์ ์ฑ ์ด ์ด๋ฌํ ๋๋ฉ์ธ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ์ญ์์ค. ์ ์ฌ์ ์ธ ์ธ์ฝ๋ฉ ๋ฌธ์ ๋ ๋ธ๋ผ์ฐ์ ๋ถ์ผ์น์ ์ ์ํ์ญ์์ค.
- ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS): CSP๋ CORS์ ํจ๊ป ์๋ํฉ๋๋ค. ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ํ๋ ๊ฒฝ์ฐ, CORS ๊ตฌ์ฑ์ด CSP ์ ์ฑ ๊ณผ ํธํ๋๋์ง ํ์ธํ์ญ์์ค.
- ์ง์ญ๋ณ ๋ณด์ ํ์ค: ์ผ๋ถ ์ง์ญ์๋ ํน์ ๋ณด์ ํ์ค์ด๋ ์๊ตฌ ์ฌํญ์ด ์์ ์ ์์ต๋๋ค. ํด๋น ์ง์ญ์ ์ฌ์ฉ์๋ฅผ ์ํด CSP๋ฅผ ๊ตฌํํ ๋ ์ด๋ฌํ ํ์ค์ ์ฐ๊ตฌํ๊ณ ์ค์ํ์ญ์์ค.
- ๋ฌธํ์ ๊ณ ๋ ค ์ฌํญ: ์น์ฌ์ดํธ๊ฐ ์ฌ์ฉ๋๊ณ ์ ๊ทผ๋๋ ๋ฐฉ์์ ๋ํ ๋ฌธํ์ ์ฐจ์ด๋ฅผ ์ผ๋์ ๋์ญ์์ค. ํน์ ์ง์ญ์ด๋ ์ธ๊ตฌ ํต๊ณ์ ํน์ ํ ์ ์ฌ์ ๋ณด์ ์ํ์ ํด๊ฒฐํ๊ธฐ ์ํด CSP ๊ตฌํ์ ์กฐ์ ํ์ญ์์ค.
- ์ ๊ทผ์ฑ: CSP ๊ตฌํ์ด ์น์ฌ์ดํธ์ ์ ๊ทผ์ฑ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ๊ธฐํ ๋ณด์กฐ ๊ธฐ์ ์ ํ์ํ ์คํฌ๋ฆฝํธ๋ ์คํ์ผ์ ์ฐจ๋จํ์ง ๋ง์ญ์์ค.
- ์ง์ญ๋ณ ํ ์คํธ: ๋ค์ํ ์ง๋ฆฌ์ ์ง์ญ๊ณผ ๋ธ๋ผ์ฐ์ ์์ CSP ๊ตฌํ์ ์ฒ ์ ํ ํ ์คํธํ์ฌ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ์ญ์์ค.
CSP ๋ฌธ์ ํด๊ฒฐ
CSP๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋๋๋ก ์ด๋ ค์ธ ์ ์์ผ๋ฉฐ, ๋ฌธ์ ์ ๋ถ๋ชํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค:
- CSP ํ์ฑํ ํ ์น์ฌ์ดํธ ์์: ์ด๋ ์ข ์ข ๋๋ฌด ์ ํ์ ์ธ ์ ์ฑ ์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ๋จ๋๋ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ ์ฑ ์ ์กฐ์ ํ์ญ์์ค.
- CSP ์๋ฐ ๋ณด๊ณ ์๊ฐ ์์ ๋์ง ์์: ์๋ฒ ๊ตฌ์ฑ์ ํ์ธํ์ฌ
report-uri(๋๋ `report-to`) ์๋ํฌ์ธํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ์๋ฒ๊ฐ POST ์์ฒญ์ ์ ๋๋ก ์ฒ๋ฆฌํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. ๋ํ, ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์ ๋ก ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด๊ณ ์๋์ง ํ์ธํ์ญ์์ค(๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ํธ๋ํฝ์ ํ์ธํ ์ ์์ต๋๋ค). - ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ฐ ์คํ์ผ ๊ด๋ จ ์ด๋ ค์: ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ฐ ์คํ์ผ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ, nonce๋ ํด์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๋๋ ์ฝ๋๋ฅผ ์ธ๋ถ ํ์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ์๋ํด ๋ณด์ญ์์ค.
- ์ 3์ ์คํฌ๋ฆฝํธ ๋ฌธ์ : SRI๋ฅผ ์ฌ์ฉํ์ฌ ์ 3์ ์คํฌ๋ฆฝํธ์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ์ญ์์ค. ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ, ์คํฌ๋ฆฝํธ๋ฅผ ๋ก์ปฌ๋ก ํธ์คํ ํ๊ฑฐ๋ ์ 3์ ์ ๊ณต์ ์ฒด์ ๋์์ ์์ฒญํด ๋ณด์ญ์์ค.
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฌธ์ : CSP๋ ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋์ง๋ง ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ์ผ๋ถ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ์ ์ฑ ์ ํ ์คํธํ์ฌ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ญ์์ค.
- CSP ์ ์ฑ ์ถฉ๋: ์ฌ๋ฌ CSP ์ ์ฑ (์: ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ด๋ ํ์ฅ ํ๋ก๊ทธ๋จ์์)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ก ์ถฉ๋ํ ์ ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ์ด๋ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋นํ์ฑํํ์ฌ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์ง ํ์ธํด ๋ณด์ญ์์ค.
๊ฒฐ๋ก
์ฝํ ์ธ ๋ณด์ ์ ์ฑ ์ ์น์ฌ์ดํธ์ ๋ณด์์ ๊ฐํํ๊ณ ๋ค์ํ ์ํ์ผ๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. CSP๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด XSS ๊ณต๊ฒฉ, ํด๋ฆญ์ฌํน ๋ฐ ๊ธฐํ ์ทจ์ฝ์ ์ ์ํ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. CSP ๊ตฌํ์ ๋ณต์กํ ์ ์์ง๋ง, ๋ณด์ ๋ฐ ์ฌ์ฉ์ ์ ๋ขฐ ์ธก๋ฉด์์ ์ ๊ณตํ๋ ์ด์ ์ ์ถฉ๋ถํ ๊ทธ๋ด ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์๊ฒฉํ ์ ์ฑ ์ผ๋ก ์์ํ๊ณ , ์ฒ ์ ํ ํ ์คํธํ๋ฉฐ, ์ ์ฑ ์ด ํจ๊ณผ์ ์ผ๋ก ์ ์ง๋๋๋ก ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์น์ด ์งํํ๊ณ ์๋ก์ด ์ํ์ด ๋ฑ์ฅํจ์ ๋ฐ๋ผ CSP๋ ํฌ๊ด์ ์ธ ์น ๋ณด์ ์ ๋ต์ ํ์์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ณ์ ๋จ์ ๊ฒ์ ๋๋ค.